package com.hospital.hospitalserver.service;

import com.hospital.hospitalserver.entity.FeeItemInfo;
import com.hospital.hospitalserver.mapper.FeeMapper;
import com.hospital.hospitalserver.util.Pager;
import com.hospital.hospitalserver.util.PagerData;
import com.hospital.hospitalserver.util.Response;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 费用配置与管理实现类
 * 2025年9月
 * e4glet
 * */
@Service
@RequiredArgsConstructor
public class FeeService {
    private final FeeMapper feeMapper;

    /**
     * 获取费用类别信息
     * */
    public Response getFeeCateList(){
        // 直接读取数据
        return Response.success(feeMapper.getFeeCateList());
    }

    /**
     * 添加费用信息项
     * */
    public Response addFeeItem(FeeItemInfo feeItem){
        Integer count = feeMapper.addFeeItem(feeItem);
        if(count>0){
            return Response.success();
        }else{
            return Response.error();
        }
    }

    /**
     * 编辑费用信息项
     * */
    public Response editFeeItem(FeeItemInfo feeItem){
        Integer count = feeMapper.editFeeItem(feeItem);
        if(count>0){
            return Response.success();
        }else {
            return Response.error();
        }
    }

    /**
     * 分页功能
     * 获取费用信息项数据总数
     * */
    private Integer getFeeItemCountsBySearch(Pager pager){
        return feeMapper.getFeeItemCountsBySearch(pager);
    }

    /**
     * 手动计算分页
     * */
    private Integer getFeeItemPageTotal(Pager pager){
        Integer feeTotalCounts = getFeeItemCountsBySearch(pager);
        Integer pageTotal = 1; //设置初始页码为1
        //数据总条数除以pageSize每页显示条数，如取余数求模，如果有余数，页码+1
        //如果可以整除，则页码等于数据总数除以pageSize
        pageTotal = feeTotalCounts/pager.getPageSize();
        if(feeTotalCounts%pager.getPageSize()>0){
            pageTotal += 1;
        }
        return pageTotal;
    }

    /**
     * 根据检索条件查询费用信息项
     * */
    private List<FeeItemInfo> getFeeItemPagersBySearch(Pager pager){
        Integer currentPage = pager.getCurrentPage();
        Integer startIndex = (currentPage - 1)*pager.getPageSize();
        pager.setStartIndex(startIndex);
        return feeMapper.getFeeItemMapperDataBySearch(pager);
    }

    /**
     * 装载费用信息项分页数据
     * */
    @Transactional(rollbackFor = Exception.class)
    public Response getFeeItemPagerDataBySearch(Pager pager){
        PagerData pagerData = new PagerData();
        pagerData.setPageTotal(getFeeItemPageTotal(pager));
        pagerData.setTotal(getFeeItemCountsBySearch(pager));
        pagerData.setData(getFeeItemPagersBySearch(pager));
        return Response.success(pagerData);
    }

    /**
     * 统计费用类型数量，启用数量，停用数量，今日更新
     * */
    public Response statsFeeItemCount(){
        return Response.success(feeMapper.statsFeeItemCount());
    }

    /**
     * 获取费用列表数据
     * 用于排班选项
     * */
    public Response getFeeItemList(){
        return Response.success(feeMapper.getFeeItemList());
    }

    /**
     * 获取检查项目中的费用类型数据
     * 用于诊断-开具检查项目
     * */
    public Response getCheckFeeItemList(){
        return Response.success(feeMapper.getCheckFeeItemList());
    }
}
